// @Description: 分析模块，task queue的模式执行weapon log的分析处理
package analyzer

import (
    "sync"
    "github.com/astaxie/beego/logs"
    "cloud_worm/util/uqueue"
)

/**
 相关的常量
 */
const (
    ComputeCoroutineLimit = 10                    // 分析weapon log的协程数
)

/**
 队列queue
 */
type ComputeQueue struct {
    MsgQ            *uqueue.Queue
}

/**
 对外通过获取的接口
 */
func ComputeQueueInstance() *ComputeQueue {
    return computeQueue
}

/**
 模块的初始化接口
 */
var computeQueue *ComputeQueue
var computeQueueOnce sync.Once

/**
 在main函数中采用_ import的方式调用该init接口实现初始化
 */
func init()  {
    computeQueueOnce.Do(func() {
        computeQueue = &ComputeQueue{}
        // compute queue的队列长度设置为：100W
        computeQueue.MsgQ = uqueue.NewQueueAndRun(ComputeHandler, 1024 * 100 * 10, ComputeCoroutineLimit)
        logs.Info("init create analyzer queue.")
    })

    taskQ := ComputeQueueInstance()
    if taskQ == nil {
        logs.Error("init create analyzer queue failed.")
    }
}


/**
 队列成员item
 */
type ComputeWorker interface {
    Deal()                          // 加入任务的类型必须具备Done接口
}

/**
 upgrade worm agent handler
 */
func ComputeHandler(item interface{})  {
    taskItem := item.(ComputeWorker)

    taskItem.Deal()

    return
}
